#include <stdio.h>
#include "ohos_init.h"
#include "cmsis_os2.h"
#include "iot_gpio.h"
#include "hi_io.h"
#include "iot_pwm.h"
#include "hi_pwm.h"
#include "hi_time.h"

/*========================================
 * 硬件配置
 ========================================*/
#define BEEP_PWM_PORT        HI_PWM_PORT_PWM2
#define BEEP_GPIO_PIN        HI_IO_NAME_GPIO_11
#define NOTE_DURATION_BASE   125000
#define NOTE_INTERVAL        30000

/*========================================
 * 扩展音符频率表（包含低音）
 ========================================*/
static const uint16_t g_tuneFreqs[] = {
    0,      // 0 休止符
    38223,  // 1 中音Do
    34052,  // 2 中音Re
    30338,  // 3 中音Mi
    28635,  // 4 中音Fa
    25511,  // 5 中音So
    22728,  // 6 中音La
    20249,  // 7 中音Si
    19111,  // 8 高音Do
    17026,  // 9 高音Re
    15169,  // 10 高音Mi
    76446,  // 11 低音Do（新增）
    68104,  // 12 低音Re（新增）
    60675   // 13 低音Mi（新增）
};

/*========================================
 * 小星星简谱
 ========================================*/
static const uint8_t g_starNotes[] = {
    1, 1, 5, 5, 6, 6, 5, 0,     // 一闪一闪亮晶晶
    4, 4, 3, 3, 2, 2, 1, 0,     // 满天都是小星星
    5, 5, 4, 4, 3, 3, 2, 0,     // 挂在天空放光明
    5, 5, 4, 4, 3, 3, 2, 0,     // 好像许多小眼睛
    1, 1, 5, 5, 6, 6, 5, 0,     // 一闪一闪亮晶晶
    4, 4, 3, 3, 2, 2, 1, 0      // 满天都是小星星
};

static const uint8_t g_starDurations[] = {
    4, 4, 4, 4, 4, 4, 4, 4,
    4, 4, 4, 4, 4, 4, 4, 4,
    4, 4, 4, 4, 4, 4, 4, 4,
    4, 4, 4, 4, 4, 4, 4, 4,
    4, 4, 4, 4, 4, 4, 4, 4,
    4, 4, 4, 4, 4, 4, 4, 4
};

/*========================================
 * 蜂鸣器初始化
 ========================================*/
static void Beep_Init(void)
{
    hi_gpio_init();
    hi_io_set_func(BEEP_GPIO_PIN, HI_IO_FUNC_GPIO_11_PWM2_OUT);
    hi_pwm_init(BEEP_PWM_PORT);
    hi_pwm_set_clock(PWM_CLK_XTAL);
}

/*========================================
 * 播放小星星
 ========================================*/
static void Music_PlayStar(void)
{
    size_t scoreLength = sizeof(g_starNotes) / sizeof(g_starNotes[0]);
    
    printf("开始播放：小星星\n");
    
    for (size_t i = 0; i < scoreLength; i++) {
        uint8_t note = g_starNotes[i];
        uint32_t duration = g_starDurations[i] * (NOTE_DURATION_BASE / 4);
        
        if (note > 0) {
            uint16_t freqDivisor = g_tuneFreqs[note];
            printf("音符%d ", note);
            
            hi_pwm_start(BEEP_PWM_PORT, freqDivisor / 2, freqDivisor);
            hi_udelay(duration);
            hi_pwm_stop(BEEP_PWM_PORT);
        } else {
            printf("休止 ");
            hi_udelay(duration);
        }
        hi_udelay(NOTE_INTERVAL);
    }
    
    printf("\n小星星播放完成\n");
}

/*========================================
 * 主任务函数
 ========================================*/
static void StarMusic_Task(void *arg)
{
    (void)arg;
    
    Beep_Init();
    
    while (1) {
        Music_PlayStar();
        printf("等待5秒后重新播放...\n");
        hi_udelay(5000000); // 等待5秒
    }
}

/*========================================
 * 系统入口
 ========================================*/
static void StarMusic_Entry(void)
{
    osThreadAttr_t attr = {
        .name = "StarMusicTask",
        .stack_size = 4096,
        .priority = osPriorityNormal
    };
    
    if (osThreadNew(StarMusic_Task, NULL, &attr) == NULL) {
        printf("创建小星星音乐任务失败!\n");
    } else {
        printf("小星星音乐任务启动成功\n");
    }
}

SYS_RUN(StarMusic_Entry);